from django.http import JsonResponse
from django.contrib.auth.models import User
from rest_framework.decorators import api_view
from drf_spectacular.utils import extend_schema, OpenApiResponse


def success_response(data=None, message='操作成功'):
    """成功响应"""
    return JsonResponse({
        'code': 200,
        'message': message,
        'data': data
    })


def error_response(message='操作失败', code=400):
    """错误响应"""
    return JsonResponse({
        'code': code,
        'message': message,
        'data': None
    })


@extend_schema(
    summary="获取用户信息",
    description="获取当前已登录用户的详细信息,包括基本资料、联系方式等",
    responses={
        200: OpenApiResponse(
            description="获取成功,返回用户详细信息",
            response={
                "type": "object",
                "properties": {
                    "code": {"type": "integer", "example": 200},
                    "message": {"type": "string", "example": "获取成功"},
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {"type": "integer", "description": "用户唯一标识ID", "example": 1},
                            "username": {"type": "string", "description": "用户名", "example": "admin"},
                            "email": {"type": "string", "description": "邮箱地址", "example": "admin@example.com"},
                            "first_name": {"type": "string", "description": "姓名-名", "example": "三"},
                            "last_name": {"type": "string", "description": "姓名-姓", "example": "张"},
                            "is_staff": {"type": "boolean", "description": "是否为管理员", "example": True},
                            "is_superuser": {"type": "boolean", "description": "是否为超级管理员", "example": True},
                            "date_joined": {"type": "string", "description": "注册时间", "example": "2024-01-01 10:00:00"},
                            "last_login": {"type": "string", "description": "最后一次登录时间", "example": "2024-01-15 14:30:00"},
                        }
                    }
                }
            }
        ),
        401: OpenApiResponse(description="用户未登录,请先登录"),
    },
    tags=["用户管理"],
    methods=["GET"]
)
@api_view(['GET'])
def get_user_info(request):
    """
    获取用户信息接口
    
    功能说明：
        - 获取当前已登录用户的详细信息
        - 包括基本资料、权限信息等
    
    请求参数：
        无
    
    返回数据：
        {
            'code': 200,
            'message': '获取成功',
            'data': {
                'id': 用户ID,
                'username': 用户名,
                'email': 邮箱,
                'first_name': 名,
                'last_name': 姓,
                'is_staff': 是否管理员,
                'is_superuser': 是否超级管理员,
                'date_joined': 注册时间,
                'last_login': 最后登录时间
            }
        }
    
    错误码：
        401: 用户未登录
        500: 服务器错误
    """
    try:
        if not request.user.is_authenticated:
            return error_response('用户未登录', 401)
        
        user = request.user
        return success_response({
            'id': user.id,
            'username': user.username,
            'email': user.email,
            'first_name': user.first_name,
            'last_name': user.last_name,
            'is_staff': user.is_staff,
            'is_superuser': user.is_superuser,
            'date_joined': user.date_joined.strftime('%Y-%m-%d %H:%M:%S'),
            'last_login': user.last_login.strftime('%Y-%m-%d %H:%M:%S') if user.last_login else None
        }, '获取成功')
    except Exception as e:
        return error_response(f'获取用户信息失败: {str(e)}', 500)


@extend_schema(
    summary="修改用户信息",
    description="修改当前已登录用户的个人信息,包括姓名、邮箱等",
    request={
        "application/json": {
            "type": "object",
            "properties": {
                "first_name": {
                    "type": "string",
                    "description": "名(可选)",
                    "example": "三"
                },
                "last_name": {
                    "type": "string",
                    "description": "姓(可选)",
                    "example": "张"
                },
                "email": {
                    "type": "string",
                    "description": "邮箱地址(可选)",
                    "format": "email",
                    "example": "zhangsan@example.com"
                }
            },
            "example": {
                "first_name": "三",
                "last_name": "张",
                "email": "zhangsan@example.com"
            }
        }
    },
    responses={
        200: OpenApiResponse(
            description="修改成功,返回更新后的用户信息",
            response={
                "type": "object",
                "properties": {
                    "code": {"type": "integer", "example": 200},
                    "message": {"type": "string", "example": "修改成功"},
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {"type": "integer", "example": 1},
                            "username": {"type": "string", "example": "admin"},
                            "email": {"type": "string", "example": "zhangsan@example.com"},
                            "first_name": {"type": "string", "example": "三"},
                            "last_name": {"type": "string", "example": "张"},
                            "is_staff": {"type": "boolean", "example": True},
                            "is_superuser": {"type": "boolean", "example": True}
                        }
                    }
                }
            }
        ),
        400: OpenApiResponse(description="请求参数错误"),
        401: OpenApiResponse(description="用户未登录,请先登录"),
    },
    tags=["用户管理"],
    methods=["PUT"]
)
@api_view(['PUT'])
def update_user_info(request):
    """
    修改用户信息接口
    
    功能说明：
        - 修改当前已登录用户的个人信息
        - 支持修改姓名、邮箱等信息
        - 邮箱会检查唯一性，不能与其他用户重复
    
    请求参数：
        first_name (str): 名，可选
        last_name (str): 姓，可选
        email (str): 邮箱，可选
    
    返回数据：
        {
            'code': 200,
            'message': '修改成功',
            'data': {
                'id': 用户ID,
                'username': 用户名,
                'email': 邮箱,
                'first_name': 名,
                'last_name': 姓,
                'is_staff': 是否管理员,
                'is_superuser': 是否超级管理员
            }
        }
    
    错误码：
        400: 请求参数错误或邮箱已被使用
        401: 用户未登录
        500: 服务器错误
    """
    try:
        if not request.user.is_authenticated:
            return error_response('用户未登录', 401)
        
        data = request.data  # 使用DRF的request.data
        user = request.user
        
        # 更新用户信息
        if 'first_name' in data:
            user.first_name = data['first_name']
        if 'last_name' in data:
            user.last_name = data['last_name']
        if 'email' in data:
            # 检查邮箱是否已被其他用户使用
            if User.objects.filter(email=data['email']).exclude(id=user.id).exists():
                return error_response('该邮箱已被其他用户使用')
            user.email = data['email']
        
        user.save()
        
        return success_response({
            'id': user.id,
            'username': user.username,
            'email': user.email,
            'first_name': user.first_name,
            'last_name': user.last_name,
            'is_staff': user.is_staff,
            'is_superuser': user.is_superuser
        }, '修改成功')
        
    except Exception as e:
        return error_response(f'修改用户信息失败: {str(e)}', 500)